package com.hmdp.utils;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;

@Component
public class RedisIdWorker {

    // 注入 Redis 模板，用于操作 Redis 中的 key-value 数据
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    // 起始时间戳（2023-01-01 00:00:00 UTC）
    // 用于计算相对时间，节省 ID 位数
    public static final long BEGIN_TIMESTAMP = 1672531200L;

    // 序列号占用的位数（32位）
    // 低 32 位用于当天的自增序号
    private static final int COUNT_BITS = 32;

    /**
     * 生成全局唯一 ID
     * @param keyPrefix Redis key 的业务前缀（用于区分不同业务线）
     * @return long 类型唯一 ID，由 时间戳 + 自增序列号 拼接组成
     */
    public long createId(String keyPrefix) {
        // 获取当前时间（UTC）
        LocalDateTime now = LocalDateTime.now();
        long nowSecond = now.toEpochSecond(ZoneOffset.UTC); // 转换为秒级时间戳

        // 计算相对时间戳（当前时间 - 起始时间）
        long timestamp = nowSecond - BEGIN_TIMESTAMP;

        // 格式化日期字符串：yyyy-MM-dd
        String date = now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));

        // 生成 Redis 的 key，例如：icrorder:2025-04-23
        // 并对该 key 进行自增操作（保证当天内自增，第二天自动归零）
        long count = stringRedisTemplate.opsForValue().increment("icr" + keyPrefix + ":" + date);

        // 使用位运算拼接 ID：
        // 高 32 位：相对时间戳（timestamp << 32）
        // 低 32 位：当天自增序号（count）
        return (timestamp << COUNT_BITS) | count;

    }

}
